/******************************************************************************
** 公司名称：天津柯迪斯科技有限公司
** 版权信息：
** 文件名称： App_Protocol_ANANDA_CAN.h
** 模块名称： 安乃达CAN协议处理模块
** 版 本 号： V1.0
** 作    者： 蒲磊
**
** 修改记录： 版本     修改人      时间         修改内容
******************************************************************************/
#ifndef __APP_PROTOCOL_ANANDA_H_
#define __APP_PROTOCOL_ANANDA_H_

/******************************************************************************
* 头文件
******************************************************************************/
#include "bsp.h"
/******************************************************************************
* 宏定义 ('#define')
******************************************************************************/
/*此宏定义定义了CAN协议采用哪种类型，总共三种类型*/
/*1-仪表控制模式。所有按键在仪表上，仪表为主机，发送某些控制帧，控制器转发这些控制帧*/
/*2-八方仪表模式。电源、助推按键在控制器，档位、大灯按键在仪表。*/
/*3-安乃达TUV模式。电源、助推、档位、大灯按键都在控制上，控制器为主机。控制器发送设置帧，仪表转发*/
#define CAN_TYPE                    TYPE_DISPLAY        /*仪表模式*/

#define TYPE_DISPLAY                0
#define TYPE_BF                     1
#define TYPE_TUV                    2

#define CAN_LOOP_CYCLE              20      /*vPROTOCOL_Loop()函数的循环调用周期，单位：ms*/
#define gxCAN_RxQueue               0x00    /*Can接收FIFO队列ID*/
#define gxCAN_TxQueue               0x01    /*Can发送FIFO队列ID*/
#define gxCAN_RxQueue_Len           (sizeof(strANANDA_CAN) * 30)    /*FIFO长度，30个元素长度*/
#define gxCAN_TxQueue_Len           (sizeof(strANANDA_CAN) * 30)
/******************************************************************************
* 类型定义 ('typedef')
******************************************************************************/
/*设备ID类型*/
typedef enum
{
    ID_PSP          = 0x20,        /*PSP、终端、诊断仪*/
    ID_DP           = 0x28,        /*仪表*/
    ID_MCU          = 0xEF,        /*控制器*/
    ID_BMS_1        = 0xF4,        /*主BMS*/
    ID_BMS_2        = 0xF7,        /*副BMS*/
    ID_CHARGER      = 0x56,        /*充电器*/
    ID_ABS          = 0xF0,        /*ABS刹车*/
    ID_IOT          = 0x21,        /*IOT智能设备*/
    ID_ANT          = 0x30,        /*ANT接收器*/
    ID_REMOTE       = 0x29,        /*REMOTE*/
} enuDEVICE_ID;

/*安乃达CAN协议结构体*/
typedef struct
{
    uint8_t Source_Adress;          /*源地址*/
    uint8_t PS;                     /*协议数据单元特定域*/
    uint8_t PDU_Format;             /*协议数据单元格式*/
    uint8_t Data_Page;              /*数据页*/
    uint8_t Reserver;               /*无用，保留*/
    uint8_t Priority;               /*优先级*/
    uint8_t Data[8];                /*数据*/
} strANANDA_CAN;

typedef struct
{
    uint8_t  Year;
    uint8_t  Month;
    uint8_t  Day;
    uint8_t  Hour;
    uint8_t  Min;
    uint8_t  Sec;
} strDATE_TIME;

/*控制器消息结构体*/
typedef struct
{
    uint8_t     Power;              /*开关机，0-关机，1-开机*/
    uint8_t     Encryption_Type;    /*加密类型,0-无加密*/
    uint8_t     Key;                /*密钥*/
    uint8_t     Device_Type;        /*设备类型，0-按键在仪表上，仪表为主机，1-安乃达TUV模式，按键在控制器上，控制为主机，2-八方模式，部分按键在控制器，控制器为主机*/
    uint8_t     PowerUp_Type;       /*开机方式，0-电源按键开机，1-唤醒开机*/
    uint16_t    User_SN;            /*客户编码*/
    uint16_t    Vehicle_Type;       /*车辆型号*/

    uint8_t     Push;               /*推行状态，0-未启动，1-准备就绪，2-推行工作状态*/
    uint8_t     InSetting;          /*进入设置状态，0-未进设置，1-进入设置*/
    uint8_t     Pas;                /*档位数值*/

    uint8_t     Head_Lamp;          /*前灯状态，0-关闭，1-打开*/
    uint8_t     Rear_Lamp;          /*尾灯状态，0-关闭，1-打开*/
    uint8_t     Trip_Clear;         /*清除Trip标志，0-不清Trip，1-清Trip*/
    uint8_t     Auto_Lamp;          /*自动大灯标志，0-自动感光模式，1-手动模式*/
    uint8_t     Display_RidingInfo; /*当前显示的骑行信息*/
    uint8_t     Button;             /*按键状态，bit4-推行键，bit5-电源键，bit6-减键，bit7-加减。0-未按下，1-按下*/
    uint8_t     PowerOFF_Info;      /*关机提示数据，0-无动作，1-休眠提示，2-关机提示，3-预留*/
    uint8_t     USB_Charging_En;    /*USB充电使能，0-不使能，1-使能*/

    uint16_t    Speed;              /*实时车速，0.1Km/h*/
    uint8_t     ErrCode;            /*故障代码*/
    uint8_t     Drive_Mode;         /*模式，0-无效，1-模式1，2-模式2，3-模式3*/

    uint8_t     Current;            /*母线电流，0.1A*/
    uint8_t     Rpm;                /*脚踏转速*/
    uint8_t     Torque;             /*脚踏力矩，1Nm*/
    uint16_t    Motor_Power;        /*电机功率，0.1W*/
    uint8_t     Motor_Torque;       /*电机扭矩，1Nm*/
    uint8_t     MCU_Temp;           /*控制器温度，-40-215度*/
    uint8_t     Motor_Temp;         /*电机温度，-40-215度*/

    uint32_t    ODO;                /*ODO里程，0.1Km，范围999999*/
    uint32_t    Trip;               /*Trip里程，0.1km，范围999999*/
    uint8_t     Range;              /*剩余里程，1km*/
    uint8_t     Wheel_Size_Index;   /*用户查看轮径索引值，0-无效，1-8寸，2-10寸，3-12寸，4-14寸，5-16寸，6-18寸，7-20寸，8-22寸，9-24寸，10-26寸，11-27寸，12-700C，13-28寸，14-29寸*/

    uint16_t    Speed_Avg;          /*平均速度，0.1km/h*/
    uint16_t    Speed_Max;          /*最高速度，0.1km/h*/
    uint16_t    Wheel_Length;       /*轮周长*/

    int8_t      MCU_SOC;            /*控制器发送的电量档位，-1-表示没有读取到该电量值，0-欠压，1-5电量档位*/
    uint8_t     Head_Lamp_Disable;  /*前照灯是否禁用。0-不禁用，1-禁用*/
    uint8_t     Rear_Lamp_Disable;  /*后灯是否禁用。0-不禁用，1-禁用*/

    uint8_t     Limit_Current_Pas;  /*当前档位限流值，0.1A*/
    uint16_t    Riding_Time;        /*骑行时间（分钟）*/
    uint16_t    Speed_Limit;        /*限速值，0.1km/h*/

    uint16_t    Human_Power;        /*骑行功率，W*/
    uint16_t    Motor_Consumption;  /*电机瞬时功耗，0.01Wh/km*/
    uint16_t    Motor_Trip_Consumption; /*电机平均功耗，0.01Wh/km*/
    uint8_t     Motor_Power_State;  /*电机降功率状态*/

    uint16_t    Hard_Version_Num;   /*硬件版本号*/
    uint16_t    Soft_Version_Num;   /*软件版本号*/
    strDATE_TIME    Production_Date;    /*生产日期*/
    uint16_t    SN_Num;             /*产品流水号*/

    uint8_t     Hard_Version_1[8];  /*硬件版本1*/
    uint8_t     Hard_Version_2[8];  /*硬件版本2*/
    uint8_t     Soft_Version_1[8];  /*软件版本1*/
    uint8_t     Soft_Version_2[8];  /*软件版本2*/
    uint8_t     SN_1[8];            /*序列号1*/
    uint8_t     SN_2[8];            /*序列号2*/
    uint8_t     SN_3[8];            /*序列号3*/
    uint8_t     Parameter_1[8];     /*参数版本号1*/
    uint8_t     Parameter_2[8];     /*参数版本号2*/
    uint8_t     Parameter_3[8];     /*参数版本号3*/
    uint8_t     User_ID_1[8];       /*客户代码1*/
    uint8_t     User_ID_2[8];       /*客户代码2*/
} strMCUInfo;

/*BMS消息结构体*/
typedef struct
{
    uint8_t     Power;              /*开关机，0-关机，1-开机*/
    uint8_t     Encryption_Type;    /*加密类型,0-无加密*/
    uint8_t     Key;                /*密钥*/
    uint16_t    Device_Type;        /*设备类型*/
    uint16_t    User_SN;            /*客户编码*/
    uint16_t    Vehicle_Type;       /*车辆型号*/

    uint8_t     Temp_Num;           /*温度探头数量*/
    uint8_t     Temp[7];            /*各探头温度，-40-215*/

    uint8_t     SOH;                /*SOH ,%*/
    int8_t      SOC;                /*SOC,1%精度,-1表示未接受到SOC数据*/
    uint16_t    Capacity_Remain;    /*剩余容量，0.01Ah*/
    uint16_t    Capacity_Full;      /*满电容量，0.01Ah*/
    uint16_t    Capacity_Design;    /*设计容量，0.01Ah*/

    uint16_t    Cell_Num_Serial;    /*电池芯体串联数量*/
    uint16_t    Cell_Num_Parallel;  /*电池芯体并联数量*/
    uint16_t    Cell_Volt[15];      /*电芯电压，1mv*/

    uint16_t    Voltage;            /*电池组电压，0.1V*/
    uint16_t    Current;            /*电池组电流，0.01A，偏移量32768*/
    uint8_t     MaxCurrent_Continued;/*最大持续电流，1A*/
    uint8_t     MaxCurrent_Peak;    /*最大峰值电流，1A*/
    uint8_t     MaxCurrent_Charge;  /*最大充电电流，0.1A*/
    uint8_t     Power_Scale;        /*功率输出系数，%*/

    uint32_t    AlarmInfo;          /*电池组警告*/
    uint32_t    ProtectInfo;        /*电池组保护信息*/

    uint8_t     Charge_State;       /*充电状态*/
    uint8_t     Discharge_State;    /*放电状态*/
    uint8_t     Charge_Flag;        /*状态标记*/

    uint16_t    Cycle_Times;        /*循环次数*/
    uint16_t    Charging_Time_Interval;/*充电时间间隔*/
    uint16_t    Charging_Time_Interval_Max;/*最大充电时间间隔*/
    uint16_t    Active_Time;        /*激活时间*/

    uint32_t    FaultCode;          /*故障代码，0-无故障*/
    uint8_t     ID_Num;             /*电池条码位数*/
    uint8_t     ID[31];             /*电池条码*/

    uint8_t     Soft_Version_1[8];  /*软件版本号*/
    uint8_t     Hard_Version_1[8];  /*硬件版本号1*/
    uint8_t     Hard_Version_2[8];  /*硬件版本号2*/

    strDATE_TIME  RTC_Time;
    strDATE_TIME  RTC_LastCalibration;  /*上次校准时间*/

} strBatteryInfo;

/*仪表消息结构体*/
typedef struct
{
    uint8_t     Power;              /*开关机，0-关机，1-开机*/
    uint8_t     Encryption_Type;    /*加密类型,0-无加密*/
    uint8_t     Key;                /*密钥*/
    uint8_t     Device_Type;        /*设备类型，0-按键在仪表上，仪表为主机，1-安乃达TUV模式，按键在控制器上，控制为主机，2-八方模式，部分按键在控制器，控制器为主机*/
    uint8_t     PowerUp_Type;       /*开机方式，0-电源按键开机，1-唤醒开机*/
    uint16_t    User_SN;            /*客户编码*/
    uint16_t    Vehicle_Type;       /*车辆型号*/

    uint8_t     Push_En;            /*推行是否使能，0-禁止，1-允许*/
    uint8_t     Push_State;         /*推行状态，0-未启动，1-准备就绪，2-进入推行*/
    uint8_t     InSetting;          /*进入设置状态，0-未进设置，1-进入设置*/
    uint8_t     Pas;                /*档位数值*/
    uint8_t     Pas_Range;          /*挡位范围*/
    uint16_t    Wheel_Length;       /*车轮周长，mm*/

    uint8_t     Head_Lamp;          /*前灯状态，0-关闭，1-打开*/
    uint8_t     Rear_Lamp;          /*尾灯状态，0-关闭，1-打开*/
    uint8_t     Trip_Clear;         /*清除Trip标志，0-不清Trip，1-清Trip*/
    uint8_t     Auto_Lamp;          /*自动大灯标志，0-自动感光模式，1-手动模式*/
    uint8_t     Display_RidingInfo; /*当前显示的骑行信息*/
    uint8_t     Speed_Limit_Type;   /*车辆最高速度模式，0-25Km/h，1-20Km/h*/
    uint8_t     Button;             /*按键状态，bit4-推行键，bit5-电源键，bit6-减键，bit7-加减。0-未按下，1-按下*/

    uint8_t     ErrCode;            /*故障代码*/
    uint8_t     Drive_Mode;         /*模式，0-无效，1-模式1，2-模式2，3-模式3*/
    uint8_t     Battery_Lamp;       /*电池灯状态*/
    uint8_t     Left_Lamp;          /*左转灯*/
    uint8_t     Right_Lamp;         /*右转灯*/

    uint16_t    Hard_Version_Num;   /*硬件版本号*/
    uint16_t    Soft_Version_Num;   /*软件版本号*/
    strDATE_TIME    Production_Date;    /*生产日期*/
    uint16_t    SN_Num;             /*产品流水号*/

    uint8_t     Hard_Version_1[8];  /*硬件版本1*/
    uint8_t     Hard_Version_2[8];  /*硬件版本2*/
    uint8_t     Soft_Version_1[8];  /*软件版本1*/
    uint8_t     Soft_Version_2[8];  /*软件版本2*/
    uint8_t     SN_1[8];            /*序列号1*/
    uint8_t     SN_2[8];            /*序列号2*/
    uint8_t     SN_3[8];            /*序列号3*/

} strDisplayInfo;

/*定义车辆信息结构体*/
typedef    struct
{
    strBatteryInfo    Battery;
    strMCUInfo		  MCU;
    strDisplayInfo    Display;
    uint8_t			  ErrCode;

} strBikeInfo;

/******************************************************************************
* 全局变量声明
******************************************************************************/

/******************************************************************************
* 函数声明
******************************************************************************/
void vPROTOCOL_Init(void);
void vPROTOCOL_Get_OneFrame(uint8_t *pData,uint16_t Len);
void vPROTOCOL_Loop(void);
void vPROTOCOL_Send_Run_Data(void);
void vPROTOCOL_Send_Config_Data(void);
void vPROTOCOL_Send_Config_Data_OneTime(void);
void vCan_Send_RequestPGN(enuDEVICE_ID Dst_ID,uint32_t PGN);
void vCAN_CanMsgToANANDAMsg(can_rx_message_type *pCanMessage);

void vPROTOCOL_Set_Button(uint8_t KeyValue);
void vPROTOCOL_Set_Display_RidingInfo(uint8_t State);
void vPROTOCOL_Set_Power(uint8_t State);
void vPROTOCOL_Set_InSetting(uint8_t State);
void vPROTOCOL_Set_ClearTrip(uint8_t State);

void vPROTOCOL_Set_Pas_Range(int8_t Pas_Range);
void vPROTOCOL_Set_Lamp(uint8_t State);
void vPROTOCOL_Set_Pas(int8_t Pas);
void vPROTOCOL_Set_Wheel(uint16_t Wheel);
void vPROTOCOL_Set_Push_En(uint8_t En);
void vPROTOCOL_Set_WheelLength(uint16_t WheelLength);
void vPROTOCOL_Set_LimitSpeed(uint16_t LimitSpeed);

void vPROTOCOL_Set_Current_Limit(uint16_t Current_Limit);
void vPROTOCOL_Set_Value_When_ExitSetting(void);

uint8_t     ucPROTOCOL_Get_Volt_Level(void);
uint16_t    usPROTOCOL_Get_Current(void);
uint16_t    usPROTOCOL_Get_Speed_Cnt(void);
uint16_t    usPROTOCOL_Get_Speed(void);
uint8_t     ucPROTOCOL_Get_Errcode(void);
uint32_t    ulPROTOCOL_Get_Trip(void);
uint32_t    ulPROTOCOL_Get_Odo(void);
uint8_t     usPROTOCOL_Get_Range(void);
uint16_t    usPROTOCOL_Get_Speed_Avg(void);
uint16_t    usPROTOCOL_Get_Speed_Max(void);
uint16_t    usPROTOCOL_Get_Motor_Power(void);
uint16_t    usPROTOCOL_Get_Riding_Time(void);
uint16_t    usPROTOCOL_Get_Wheel(void);
uint16_t    usPROTOCOL_Get_Wheel_Lenght(void);
uint16_t    usPROTOCOL_Get_Speed_Limit(void);
uint8_t     ucPROTOCOL_Get_Push_Status(void);
uint8_t     ucPROTOCOL_Get_Pas(void);
uint8_t     ucPROTOCOL_Get_IsInSetting(void);
uint8_t     ucPROTOCOL_Get_Lamp_Status(void);
uint8_t     ucPROTOCOL_Get_DisplayRidingInfo(void);
uint8_t     ucPROTOCOL_Get_Up_Key(void);
uint8_t     ucPROTOCOL_Get_Down_Key(void);
uint8_t     ucPROTOCOL_Get_Power_Key(void);
uint8_t     ucPROTOCOL_Get_Push_Key(void);
int8_t       cPROTOCOL_Get_Soc(void);

char        *pPROTOCOL_Get_MCU_Hard_Version_1(void);
char        *pPROTOCOL_Get_MCU_Hard_Version_2(void);
char        *pPROTOCOL_Get_MCU_Soft_Version_1(void);
char        *pPROTOCOL_Get_MCU_Soft_Version_2(void);
char        *pPROTOCOL_Get_MCU_SN_1(void);
char        *pPROTOCOL_Get_MCU_SN_2(void);
char        *pPROTOCOL_Get_MCU_SN_3(void);
char        *pPROTOCOL_Get_MCU_Param_1(void);
char        *pPROTOCOL_Get_MCU_Param_2(void);
char        *pPROTOCOL_Get_MCU_Param_3(void);
char        *pPROTOCOL_Get_MCU_UserID_1(void);
char        *pPROTOCOL_Get_MCU_UserID_2(void);
uint16_t    usPROTOCOL_Get_MCU_HardVersion_Num(void);
uint16_t    usPROTOCOL_Get_MCU_SoftVersion_Num(void);
uint16_t    usPROTOCOL_Get_BMS_Voltage(void);
int16_t      sPROTOCOL_Get_BMS_Current(void);
uint8_t     ucPROTOCOL_Get_BMS_SOH(void);
int8_t       cPROTOCOL_Get_BMS_SOC(void);
uint16_t    usPROTOCOL_Get_BMS_ResCap(void);
uint8_t     ucPROTOCOL_Get_BMS_CycleTimes(void);
uint8_t     ucPROTOCOL_Get_BMS_SeriesNum(void);
uint8_t     ucPROTOCOL_Get_BMS_ParallelNum(void);
uint16_t    usPROTOCOL_Get_BMS_Cell_Voltage(uint8_t CellNum);
char        *pPROTOCOL_Get_BMS_Barcode(void);
char        *pPROTOCOL_Get_BMS_Soft_Version(void);
char        *pPROTOCOL_Get_BMS_Hard_Version_1(void);
char        *pPROTOCOL_Get_BMS_Hard_Version_2(void);

void vPROTOCOL_Send(void);
void vPROTOCOL_ResetCommunicationOverTime(void);
void vPROTOCOL_Set_Value_When_PowerOn(void);


void vPROTOCOL_Factory_Command(can_rx_message_type *pCanRxMsg);

#endif
